package com.starbuzz.coffee;

import com.starbuzz.coffee.component.Beverage;
import com.starbuzz.coffee.component.DarkRoast;
import com.starbuzz.coffee.component.Expresso;
import com.starbuzz.coffee.component.HouseBlend;
import com.starbuzz.coffee.decorator.Mocha;
import com.starbuzz.coffee.decorator.Soy;
import com.starbuzz.coffee.decorator.Whip;

/* The Decorator Pattern attaches additional responsibilities to an object
 * dynamically. Decorators provide a flexible alternative to subclassing
 * for extending functionality.
 * 
 * */

public class StarbuzzCoffee {
	public static void main(String[] args) {
		Beverage beverage = new Expresso();
		System.out.println(beverage.getDescription() + " $" + beverage.cost());
		
		Beverage beverage2 = new DarkRoast(); //concrete component
		beverage2 = new Mocha(beverage2);	//decorator
		beverage2 = new Mocha(beverage2);	//decorator
		beverage2 = new Whip(beverage2);	//decorator
		System.out.println(beverage2.getDescription() + " $" + beverage2.cost());
		
		Beverage beverage3 = new HouseBlend();
		beverage3 = new Soy(beverage3);
		beverage3 = new Mocha(beverage3);
		beverage3 = new Whip(beverage3);
		System.out.println(beverage3.getDescription() + " $" + beverage3.cost());
	}
}
